package com.crazybytex.fragment.jsontyperesolver;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

/**
 * @description
 * @Author 本文作者 程序员潇然 疯狂的字节X https://www.crazybytex.com/
 * @Date 2022/7/29 10:43
 * @Description
 *
 * 用来记录 FastJson2 针对不用的子类型的解析
 *
 * 对于常用的返回结果,通常是下面的这种形式,或者是嵌套的类型都可以使用
 *
 * 借助于 MessageWrapper 封装类型,和实际的数据
 * 格式为
 * type和data
 * type 用于类型标记,简单说就是可以根据这个值找到具体的类型, 比如可以通过配置,通过map进行获取等等,总之能找到具体子类型就可以
 * 比如我使用的就是map  详情见 TypeMapperMap
 * data是具体子类型的数据的json部分,这里面的所有的字段才是真正的数据
 * {
 *     "data": {
 *         "code": "2",
 *         "message2": "msg2  2",
 *         "message2Other": "meg2-other",
 *         "msg": "msg0-2"
 *         data里面的内容无所谓,只要是对应的子类型的json数据即可
 *     },
 *     "type": "2"
 * }
 *
 * 思路就是分两次解析
 * 第一次解析,结果为MessageWrapper,这样里面的type字段就可以拿到了
 * 第二次获取JSONObject中的data字段的属性,解析为对应的子类型即可
 **/
public class Tester {
    public static void main(String[] args) {

         /*
        {"code":"0","msg":"message "}
        {"code":"1","message1":"msg1  1","msg":"msg0-1"}
        {"code":"2","message2":"msg2  2","message2Other":"meg2-other","msg":"msg0-2"}
        * */
        String testJsonString1 = "{\n" +
                "\t\"data\": {\n" +
                "\t\t\"code\": \"1\",\n" +
                "\t\t\"message1\": \"msg1  1\",\n" +
                "\t\t\"msg\": \"msg0-1\"\n" +
                "\t},\n" +
                "\t\"type\": \"1\"\n" +
                "}";


        String testJsonString2 = "{\"data\":{\"code\":\"2\",\"message2\":\"msg2  2\",\"message2Other\":\"meg2-other\",\"msg\":\"msg0-2\"},\"type\":\"2\"}";


        String test = testJsonString2;

        /*************************************************/

        MessageWrapper messageWrapper = JSON.parseObject(test, MessageWrapper.class);

        JSONObject jsonObject = JSON.parseObject(test);
        Message message = jsonObject.getObject("data", TypeMapperMap.type(messageWrapper.getType()));
        messageWrapper.setData(message);
        //可以看到已经变为具体的类型了,还可以根据具体的子类型进行不同的逻辑处理
        if (messageWrapper.getData() instanceof Message1) {
            System.out.println("处理消息类型1"+messageWrapper);
        } else if (messageWrapper.getData() instanceof Message2) {
            System.out.println("处理消息类型2"+messageWrapper);
        }

    }
}
